// 引用express框架
const express = require('express');
// 处理路径
const path = require('path');
// 引入body-parser模块 用来处理post请求参数
const bodyParser = require('body-parser');
// 导入express-session模块
const session = require('express-session');
// 创建网站服务器
const app = express();

// 数据库连接
require('./model/connect');

// 处理post请求参数，用bodypaser的urlencoded方法来处理参数
// extended: false 值为false 这个方法内部将使用系统模块quringstring来处理参数的格式；
// 为true，将使用qs的第三方模块来处理
app.use(bodyParser.urlencoded({ extended: false }));
// 引入数据user (做调试用，用完删除)
// require('./model/user');

// 调用use中间件  配置session
app.use(session({
    secret: 'secret key',
    resave: false, //添加 resave 选项
    saveUninitialized: true, //添加 saveUninitialized 选项
    // secret: 'aF,.j)wBhq+E9n#aHHZ91Ba!VaoMfC', // 建议使用 128 个字符的随机字符串
    // cookie: { maxAge: 60 * 1000 }
}));


// 告诉express框架模板所在的位置
app.set('views', path.join(__dirname, 'views'));
// 告诉express框架模板的默认后缀是什么
app.set('view engine', 'art');
// 当渲染后缀为art的模板时，所使用的模板引擎是什么
app.engine('art', require('express-art-template'));
// 开放静态资源文件
app.use(express.static(path.join(__dirname, 'public')));
// 引入路由模块
const home = require('./route/home');
const admin = require('./route/admin');

// 拦截请求，判断用户登录状态
app.use('/admin', require('./middleware/loginGuard'))


// 为路由匹配请求路径
// 这里已经改为绝对路径，路径名home和admin可以更改，不会影响静态资源文件的访问
app.use('/home', home);
app.use('/admin', admin);

// 错误处理中间件
// 四个参数、err：错误信息、req：请求对象、res：响应对象、next方法
app.use((err, req, res, next) => {
    // 因为传递过来的是字符串。从字符串里面很难拿到对象 所以
    // 将字符串再转化为对象数据类型JSON.parse()
    const result = JSON.parse(err);
    // let obj = { path: '/admin/user-edit', message: '密码比对失败，不能进行用户信息的修改', id: id }
    // obj 和result 是一样的值
    let params = [];
    for (let attr in result) { // attr 就是path、message、id
        if (attr != 'path') {
            params.push(attr + '=' + result[attr]); // 例如：message 密码比对失败
        }
    }
    // 将拼接好的字符串放入参数?后面  数组用&进行分隔 parmas.join('&')方法
    res.redirect(`${result.path}?${params.join('&')}`);

})
// 监听端口80
app.listen(80);
console.log('网站服务器启动成功，请访问localhost');